// 引入DHT11库，温湿度传感器
#include <dht11.h>
#include <Adafruit_GFX.h>
// OLED显示
#include <Adafruit_SSD1306.h> 
// 温湿度传感器引脚，2对应D4
#define DHT11PIN 2
// MQ-2引脚            
#define MQ2_ANALOG_PIN A0 
#define MQ2_DIGITAL_PIN 14

/*************定义类型****************/
// 实例化
dht11 DHT11;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

int sensorValue;
float ad_co_f = 0;
int pinBuzzer = 12;
float temp=0; // 温度
float hum=0;  // 湿度
// 初始化
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  // OLED屏初始化
  OLED_Init();
  // MQ-5初始化，设置引脚为输入
  pinMode(MQ2_DIGITAL_PIN, INPUT);
  // 蜂鸣器初始化，设置引脚为输出
  pinMode(pinBuzzer, OUTPUT);
  // 等待5s
  delay(5000);
}
// 循环函数
void loop() {
   Serial.println("获取温湿度");
   // 获取温湿度
   DHT11.read(DHT11PIN);
   temp = getTemperature();
   hum = getHumidity();
   Serial.print("当前湿度(%): ");
   Serial.println(hum, 2);
   Serial.print("当前温度（℃）：");
   Serial.println(temp, 2);
   Serial.println("获取MQ-5数据");
   // 获取MQ-2上的数据
   sensorValue = getSensorValue();
   ad_co_f=sensorValue*(3.3/1024);
   Serial.println("显示到OLED屏");
   oled.clearDisplay();
   OLED_Show_Temperature(temp);
   OLED_Show_Humidity(hum);
   OLED_Show_MQ2(sensorValue`);
   oled.display();
   if (digitalRead(MQ2_DIGITAL_PIN)==LOW)
   {
    Serial.println("蜂鸣器响了");
    activateVoice();
   } else{
    Serial.println("蜂鸣器停了");
    deactivateVoice();
   }
   delay(1000);
}

void OLED_Init()
{
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3c);
  oled.setTextColor(WHITE);
  oled.clearDisplay();
}

void OLED_Show_Temperature(float temp)
{
  // 显示温度
  oled.setTextSize(1.9);
  oled.setCursor(5, 1);
  oled.print("Temp:  ");
  oled.print(temp);
  oled.println("C");
}

void OLED_Show_Humidity(float hum)
{
  // 显示湿度
  oled.setTextSize(1.9);
  oled.setCursor(5, 12);
  oled.print("Humidity:");
  oled.print(hum);
  oled.println("%");
}

void OLED_Show_MQ2(int alarm)
{
  oled.setTextSize(1.9);
  oled.setCursor(5, 24);
  oled.print("CO alarm:  ");
  oled.println(alarm);
}
// DHT11温湿度传感器值
double Fahrenheit(double celsius)
{
  return 1.8 * celsius + 32;
}

double Kelvin(double celsius)
{
  return celsius + 273.15;
}

float getHumidity()
{
  return (float)DHT11.humidity;
}

float getTemperature()
{
  return (float)DHT11.temperature;
}
// 控制蜂鸣器函数
void activateVoice()
{
  tone(pinBuzzer, 300, 500);
}
void deactivateVoice()
{
  noTone(pinBuzzer);
}
// 获取MQ-2传感器值
int getSensorValue()
{
  return analogRead(MQ2_ANALOG_PIN);
}
